package com.kuangstudy.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kuangstudy.entity.User;
import com.kuangstudy.mapper.UserMapper;
import com.kuangstudy.utils.JsonUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

/**
 * @author 飞哥
 * @Title: 学相伴出品
 * @Description: 我们有一个学习网站：https://www.kuangstudy.com
 * @date 2021/5/20 12:36
 */
@Service
@Log4j2
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @return void
     * @Author 徐柯
     * @Description 新增用户
     * @Date 12:37 2021/5/20
     * @Param []
     **/
    public void saveupdateUser(User user) {
        // 1：保存用户数据到数据库中
        this.saveOrUpdate(user);
        // 2: 把数据查询出来放入到缓存中
        user = this.getById(user.getId());
        // 同时缓存用户数据到redis中
        String key = "user:" + user.getId();
        // redis中修改和更新都是用set
        redisTemplate.opsForValue().set(key, user);
    }


    /**
     * @return void
     * @Author 徐柯
     * @Description 查询用户明细
     * @Date 12:37 2021/5/20
     * @Param []
     **/
    public User getUser(Integer userid) {
        // 1：首先在缓存中去查询看是否存在
        ValueOperations<String, User> valueOperations = redisTemplate.opsForValue();
        User cacheUser = valueOperations.get("user:" + userid);
        // 2：如果不存在就直接去数据库查询
        if (cacheUser == null) {
            // 3：根据用户id查询用户信息
            cacheUser = this.getById(userid);
            // 4：建立Redis缓存的key
            String key = "user:" + cacheUser.getId();
            // 5：把查询出来的数据放入到缓存中
            redisTemplate.opsForValue().set(key, cacheUser);
        } else {
            log.info("命中到索引：", JsonUtil.obj2String(cacheUser));
        }
        // 6 :查询并返回
        return cacheUser;
    }

}
